﻿#define _CRT_SECURE_NO_WARNINGS 1
//
//#include<stdio.h>
//int main()
//{
//
//}

//////匿名结构体类型
////struct
////{
////	int a;
////	char b;
////	float c;
////}x;
////struct
////{
////	int a;
////	char b;
////	float c;
////}a[20], * p;
//
////代码1
//struct Node
//{
//	int data;
//	struct Node next;
//};//这种方式不行
//
//
////代码2
//struct Node
//{
//	int data;
//	struct Node* next;
//};
//
////代码3
//typedef struct
//{
//	int data;
//	Node* next;
//}Node;
////这样写代码，可行否？
////解决方案：
//typedef struct Node
//{
//	int data;
//	struct Node* next;
//}Node;

//typedef struct Node
//{
//	int data;
//	Node* next;
//}Node;

//struct Point
//{
//	int x;
//	int y;
//}p1;           //声明类型的同时定义变量p1
//struct Point p2;        //定义结构体变量p2
//
//
////初始化：定义变量的同时赋初值。
////struct Point p3 = {3, 5};
//
//struct Stu        //类型声明
//{
//	char name[15];    //名字
//	int age;       //年龄
//};
//
//
//struct Stu s = { "zhangsan", 20 };//初始化



//struct Node
//{
//	int data;
//	struct Point p;
//	struct Node* next;
//}n1 = { 10, {4,5}, NULL }; //结构体嵌套初始化
//struct Node n2 = { 20, {5, 6}, NULL };//结构体嵌套初始化

//结构体类型
//struct Point
//{
//    int x;
//    int y;
//}p1;            //声明类型的同时定义变量p1,是全局变量-静态区
//int main()
//{
//    struct Point p2;       //定义结构体变量p2,局部变量-栈区
//    //初始化：定义变量的同时赋初值。
//    struct Point p3 = {3, 5};
//
//struct Point
//{
//	int x;
//	int y;
//}p1;
//struct Node
//{
//	int data;
//	struct Point p;
//	struct Node* next;
//}n1 = { 10, {4,5}, NULL}; //结构体嵌套初始化
//
//struct Node n2 = { 20, {5, 6}, NULL};//结构体嵌套初始化
//
//typedef struct Node
//{
//	int data;
//	Node* next;
//}Node;


////练习1
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//printf("%d\n", sizeof(struct S1));
////练习2
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//printf("%d\n", sizeof(struct S2));
////练习3
//struct S3
//{
//	double d;
//	char c;
//	int i;
//};
//printf("%d\n", sizeof(struct S3));
//
////练习4-结构体嵌套问题
//struct S4
//{
//	char c1;
//	struct S3 s3;
//	double d;
//};
//printf("%d\n", sizeof(struct S4));
//
//
//
////例如：
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//struct S2
//{
//	char c1;
//	char c2;
//	int i;
//};
//#include <stdio.h>
//#pragma pack(8)//设置默认对齐数为8
//struct S1
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的默认对齐数，还原为默认
//#pragma pack(1)//设置默认对齐数为1
//struct S2
//{
//	char c1;
//	int i;
//	char c2;
//};
//#pragma pack()//取消设置的默认对齐数，还原为默认
//int main()
//{
//	//输出的结果是什么？
//	printf("%d\n", sizeof(struct S1));
//	printf("%d\n", sizeof(struct S2));

////计算对齐数的
//#include<stdio.h>
////头文件
//#include<stddef.h>
//struct S
//{
//	char c;
//	int i;
//	double d;
//};
//int main(void)
//{
//	//第一个参数是结构题类型名
//	printf("%d\n", offsetof(struct S, c));  //0
//	printf("%d\n", offsetof(struct S, i));  //4
//	printf("%d\n", offsetof(struct S, d));  //8
//}

//#include<stdio.h>
////位段-二进制位
//struct S   
//{
//	int a : 2;      //2个bit位-2个二进制位-表示四种可能
//	int b : 5;
//	int c : 10;
//	int d : 30;
//	//不能大于32
//};
////47位-6个字节
//int main()
//{
//	struct S s;
//	printf("%d\n", sizeof(s));  //8个字节 
//	return 0;
//}
//
//#include<stdio.h>
//struct S
//{
//	char a : 3;       // 3表示需要个bit的空间 
//	char b : 4;
//	char c : 5;
//	char d : 4;
//};
//int main()
//{
//	struct S s = { 0 };
//	s.a = 10;
//	s.b = 20;
//	s.c = 3;
//	s.d = 4;              //内存：22 03 04 
//	return 0;
//}
//
//enum Day//星期
//{
//	Mon,
//	Tues,
//	Wed,
//	Thur,
//	Fri,
//	Sat,
//	Sun
//};
//enum Sex//性别
//{
//	MALE,
//	FEMALE,
//	SECRET
//}；
//enum Color//颜色
//{
//	RED,
//	GREEN,
//	B
//}

//#include<stdio.h>
//enum Sex
//{
//	//枚举的可能取值-常量
//	MALE = 2,  //赋初始值
//	FEMALE = 4,
//	SECRET //是ok的
//};
//int main(void)
//{
//	enum Sex s = MALE;          //等号右边必须是枚举的例子
//	//只能拿枚举常量给枚举变量赋值，才不会出现类型的差异。
//	printf("%d %d %d\n", MALE, FEMALE, SECRET);
//	//MALE = 0；   //error   常量可以赋初始值，但是不能再被修改了  eg:const int num = 10;
//	//enum Sex s = 2;    //error 两边类型不同enum Sex类型--int类型
//}

//#include<stdio.h>
////联合类型的声明
//union Un
//{
//	char c;
//	int i;
//};
//int main()
//{
//	//联合变量的定义
//	union Un un;
//	//计算连个变量的大小
//	printf("%d\n", sizeof(un));  //4
//
//	printf("%p\n", &un);           
//	printf("%p\n", &(un.c));        
//	printf("%p\n", &(un.i));    
//	//009CF8E4
//	//009CF8E4
//	//009CF8E4
//	return 0;
//}


#include<stdio.h>
union un
{
	int a;        //4      4 8 4 
	char arr[5];  //5      1 8 1    
};

int main(void)
{
	union un u;
	printf("%d\n", sizeof(u));   //8个字节 不是5个字节
	return 0;
}
